using OrchardCore.Modules.Manifest;

/*
 * 模块清单文件 - TrainingDemo 模块的核心配置文件
 * 
 * 功能说明：
 * - 定义模块的基本信息、版本和描述
 * - 配置模块的多个特性（Features）
 * - 声明模块对其他 Orchard Core 特性的依赖关系
 * - 提供模块在管理界面中的显示信息
 * 
 * 设计模式：
 * - 使用程序集特性（Assembly Attributes）进行模块配置
 * - 采用特性分离模式，将大型模块分解为多个独立功能
 * - 通过依赖注入确保模块间的正确加载顺序
 * 
 * 使用场景：
 * - 模块安装和配置
 * - 特性管理和启用/禁用
 * - 依赖关系解析和加载
 * - 管理界面显示和分类
 */

#pragma warning disable SA1114 // Parameter list should follow declaration (necessary for the comment)
/// <summary>
/// 主模块定义 - 定义 TrainingDemo 模块的基本信息和元数据
/// 
/// 主要用途：
/// - 声明模块的基本信息（名称、作者、版本等）
/// - 提供模块在管理界面中的显示信息
/// - 定义模块的网站链接和描述信息
/// 
/// 设计原因：
/// - 为模块提供统一的身份标识
/// - 支持模块的版本管理和更新
/// - 便于用户识别和了解模块功能
/// </summary>
[assembly: Module(
    // 模块的显示名称。如果模块只有一个特性，将在仪表板的模块页面中显示
    // Display name of the module. Will be displayed on the Modules page of the Dashboard if the module has just one
    // feature (see below).
    Name = "Lombiq Training Demo",
#pragma warning restore SA1114 // Parameter list should follow declaration
    // 您的姓名、公司或任何标识项目开发人员的名称
    // Your name, company or any name that identifies the developers working on the project.
    Author = "Lombiq Technologies",
    // 可选：您可以添加网站 URL（例如您的公司网站、GitHub 仓库 URL）
    // Optionally you can add a website URL (e.g. your company's website, GitHub repository URL).
    Website = "https://github.com/Lombiq/Orchard-Training-Demo-Module",
    // 模块版本号
    // Version of the module.
    Version = "0.0.1",
    // 模块的简短描述
    // Short description of the module.
    Description = "Orchard Core training demo module for teaching Orchard Core fundamentals primarily by going " +
        "through its source code."
)]

/*
 * 特性（Features）说明：
 * 
 * 这是一个大型模块，因此有多个特性。什么是特性？您可以将模块分为多个"特性"；
 * 在 Orchard 的概念中，特性是您可以在管理界面上单独开启或关闭的功能片段。
 * 它就像一个子模块。
 * 
 * 如果您在模块中有多个特性，那么您还必须有一个基础特性（否则您无法开启它）。
 * 如果您没有多个特性，那么下面的 Category 和 Dependencies 配置可以直接放在 Module 特性中。
 * 
 * 特性设计模式：
 * - 模块化设计：将大型模块分解为独立的功能单元
 * - 按需加载：用户可以根据需要启用或禁用特定功能
 * - 依赖管理：通过依赖关系确保功能的正确加载顺序
 * - 分类管理：通过分类组织相关功能，便于管理
 */

#pragma warning disable SA1114 // Parameter list should follow declaration (necessary for the comment)
/// <summary>
/// 基础特性定义 - TrainingDemo 模块的主要功能特性
/// 
/// 主要用途：
/// - 定义模块的核心功能和主要特性
/// - 声明对其他 Orchard Core 特性的依赖关系
/// - 提供特性在管理界面中的显示信息
/// 
/// 设计模式：
/// - 基础特性模式：作为模块的主要功能入口
/// - 依赖注入模式：通过依赖列表确保功能完整性
/// - 分类管理模式：通过分类组织相关功能
/// 
/// 使用场景：
/// - 模块安装和初始化
/// - 功能依赖解析和加载
/// - 管理界面功能展示
/// </summary>
[assembly: Feature(
    // 特性的技术 ID。基础特性应该与模块具有相同的名称（即其 csproj 文件）
    // The technical ID of the feature. The base feature should have the same name as the module (i.e. its csproj file).
    Id = "Ruitu.Edu.TrainingDemo",
#pragma warning restore SA1114 // Parameter list should follow declaration
    // 特性的显示名称，显示在仪表板的模块页面上
    // Display name of the feature, displayed on the Modules page of the Dashboard.
    Name = "Lombiq Training Demo",
    // 特性在仪表板上进行分类，因此将相似的功能/模块放在一个单独的部分是个好主意
    // Features are categorized on the Dashboard so it's a good idea to put similar features/modules together into a
    // separate section.
    Category = "Training",
    // 特性的简短描述。它将显示在仪表板上（您可以在那里启用/禁用它）
    // Short description of the feature. It will be displayed on the Dashboard (where you can enable/disable it).
    Description = "Orchard Core training demo module for teaching Orchard Core fundamentals primarily by going " +
        "through its source code.",
    // 特性可以有依赖项，这些依赖项是其他模块名称（项目名称）或如果这些模块也有子特性，则是特性名称
    // 如果您使用来自 Orchard Core 特性的任何服务、标签助手等，则需要将它们包含在此列表中
    // Orchard Core 将确保在启用具有依赖项的特性时启用所有依赖特性
    // 没有这个，即使程序集在项目中引用，某些特性也无法工作
    // Features can have dependencies which are other module names (name of the project) or if these modules have
    // sub-features too then the name of the feature. If you use any service, taghelper etc. coming from an Orchard Core
    // feature then you need to include them in this list. Orchard Core will make sure to enable all dependent features
    // when you enable a feature that has dependencies. Without this some features would not work even if the assembly
    // is referenced in the project.
    Dependencies =
    [
        // 管理界面功能 - 提供管理界面的基本功能
        "OrchardCore.Admin",
        // GraphQL API 功能 - 提供 GraphQL 查询接口
        "OrchardCore.Apis.GraphQL",
        // 后台任务功能 - 支持异步任务处理
        "OrchardCore.BackgroundTasks",
        // 内容字段功能 - 提供自定义内容字段支持
        "OrchardCore.ContentFields",
        // 内容管理功能 - 提供内容项的基本管理功能
        "OrchardCore.Contents",
        // 内容类型功能 - 支持自定义内容类型定义
        "OrchardCore.ContentTypes",
        // 动态缓存功能 - 提供高性能缓存支持
        "OrchardCore.DynamicCache",
        // 特性管理功能 - 支持特性的启用/禁用管理
        "OrchardCore.Features",
        // 主页路由功能 - 提供主页路由配置
        "OrchardCore.HomeRoute",
        // 层级功能 - 支持内容层级管理
        "OrchardCore.Layers",
        // 本地化功能 - 提供多语言支持
        "OrchardCore.Localization",
        // 媒体管理功能 - 提供文件上传和管理
        "OrchardCore.Media",
        // 导航功能 - 支持菜单和导航管理
        "OrchardCore.Navigation",
        // 配方功能 - 支持模块安装和配置
        "OrchardCore.Recipes",
        // 资源管理功能 - 提供静态资源管理
        "OrchardCore.Resources",
        // 角色管理功能 - 支持用户角色和权限
        "OrchardCore.Roles",
        // 设置管理功能 - 提供站点设置管理
        "OrchardCore.Settings",
        // 主题功能 - 支持主题管理和切换
        "OrchardCore.Themes",
        // 用户管理功能 - 提供用户账户管理
        "OrchardCore.Users",
        // 工作流功能 - 支持业务流程自动化
        "OrchardCore.Workflows",
    ]
)]

/*
 * 子特性定义：
 * 
 * 我们还有第二个特性！这展示了如何将大型模块分解为多个独立的功能单元。
 * 每个子特性都可以独立启用或禁用，提供了更大的灵活性。
 */

#pragma warning disable SA1114 // Parameter list should follow declaration (necessary for the comment)
/// <summary>
/// 中间件子特性 - 专门用于演示中间件功能的独立特性
/// 
/// 主要用途：
/// - 演示如何将中间件功能分离到独立特性中
/// - 提供中间件开发的最佳实践示例
/// - 展示子特性的依赖关系管理
/// 
/// 设计模式：
/// - 功能分离模式：将特定功能独立为子特性
/// - 依赖继承模式：子特性依赖基础特性
/// - 模块化设计：支持功能的独立部署和管理
/// 
/// 使用场景：
/// - 中间件开发和测试
/// - 功能模块的独立部署
/// - 按需加载特定功能
/// </summary>
[assembly: Feature(
    // 我们通常为子特性后缀基础特性/模块 ID 和名称
    // We commonly suffix the base feature/module ID and name for sub-features.
    Id = "Ruitu.Edu.TrainingDemo.Middlewares",
#pragma warning restore SA1114 // Parameter list should follow declaration
    Name = "Lombiq Training Demo - Middlewares",
    Category = "Training",
    Description = "Demonstrates how to write middlewares in a separate feature.",
    // 子特性通常依赖于基础特性，但这不是强制性的
    // It's usual for sub-features to depend on the base feature but this is not mandatory.
    Dependencies =
    [
        "Ruitu.Edu.TrainingDemo",
    ]
)]

/*
 * 特性激活机制：
 * 
 * 如何区分启用特性时激活的内容？使用相同的 Feature 特性！
 * 查看 Startup.cs 文件中对应于两个特性的 Startup 类，然后在这里跟进！
 * 
 * 特性激活设计模式：
 * - 条件激活：根据启用的特性条件性地激活功能
 * - 服务注册：在 Startup 类中注册相应的服务
 * - 配置加载：根据特性状态加载相应的配置
 * 
 * 学习要点：
 * - 理解 Orchard Core 的模块化架构
 * - 掌握特性依赖关系的管理
 * - 学习如何设计可扩展的模块结构
 */

// 训练部分结束：模块清单
// 下一站：Controllers/YourFirstOrchardCoreController.cs
